﻿#include "mainwindow.h"
#include "ui_mainwindow.h"

#pragma execution_character_set("utf-8")//定义编码方式

void MainWindow::hasDestory()
{
    qDebug()<<"已经被销毁";
    flushPage(1,0);
}


MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initFun();
    initAttr();
}

/*
 * @author  : Zeeland
 * @describe: 初始化控件属性
 * @param   : null
 * @return  : void
 */
void MainWindow::initAttr()
{

    ui->lineEdit_searchMan->setPlaceholderText("请输入姓名搜索联系人");
    ui->tableWidget_phone->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑模式
    ui->tableWidget_sim->setEditTriggers(QAbstractItemView::NoEditTriggers);
    setWindowTitle("Mobile Phone Address Book Mangement System");
    //设置背景
    QPalette palette;
    QPixmap pixmap1("./images/bg1.jpg");
    palette.setBrush(QPalette::Background, QBrush(pixmap1));
    setPalette(palette);

    QPixmap pixmap2("./images/LitterDr.png");
    QIcon icon(pixmap2);
    setWindowIcon(icon);


    ui->tableWidget_PerCount->verticalHeader()->setVisible(false);
    ui->tableWidget_PerCount->horizontalHeader()->setVisible(false);
    ui->tableWidget_PerCount->setEditTriggers(QAbstractItemView::NoEditTriggers);//无编辑触发器

    //设置快捷键
    ui->btn_search->setShortcut(QString("ctrl+f"));

}


/*
 * @author  : Zeeland
 * @describe: 控件功能初始化，包括初始化信号与槽、导入文件
 * @param   : null
 * @return  : void
 */
void MainWindow::initFun()
{
    //刷新数据
    flushPage(0,1);



    //页面跳转
    connect(ui->btn_toSimPage,&QPushButton::clicked,this,&MainWindow::changeSimPage);
    connect(ui->btn_toPhonePage,&QPushButton::clicked,this,&MainWindow::changePhonePage);

    //搜索联系人
    connect(ui->lineEdit_searchMan,&QLineEdit::textChanged,this,&MainWindow::searchPerson);
    connect(ui->btn_search,&QPushButton::clicked,this,&MainWindow::searchPerson);

    //添加联系人
    connect(ui->btn_simAdd,&QPushButton::clicked,this,&MainWindow::addPerson);
    connect(ui->btn_phoneAdd,&QPushButton::clicked,this,&MainWindow::addPerson);

    //删除联系人
    connect(ui->btn_simDelete,&QPushButton::clicked,this,&MainWindow::deletePerson);
    connect(ui->btn_phoneDelete,&QPushButton::clicked,this,&MainWindow::deletePerson);

    //转移联系人
    connect(ui->btn_PToS,&QPushButton::clicked,this,&MainWindow::pToS);
    connect(ui->btn_SToP,&QPushButton::clicked,this,&MainWindow::sToP);

    //编辑联系人
    connect(ui->btn_simModify,&QPushButton::clicked,this,&MainWindow::modifyPerson);
    connect(ui->btn_phoneModify,&QPushButton::clicked,this,&MainWindow::modifyPerson);

}


/*
 * @author  : Zeeland
 * @describe: 刷新当前页面中QtableWidget中的数据
 * @param   : null
 * @return  : void
 */
void MainWindow::flushPage(int index)
{
    //先清空tableWidget中的数据
    clearPage(index);

    QTableWidget *tableWidget;
    QFile file;
    if(index ==0)
    {
       tableWidget = ui->tableWidget_phone;
       file.setFileName("./Data/phoneData.txt");
    }
    else
    {
       tableWidget = ui->tableWidget_sim;
       file.setFileName("./Data/simData.txt");
    }
    int count =0,row;//获取当前行与列
    QString displayString;
    if(!file.open(QIODevice::ReadWrite)){
        QMessageBox::critical(this, "critical", "file open failed", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);//警告对话框
    }
    else
    {
        while(!file.atEnd())
        {
            QByteArray line = file.readLine();
            QString str(line);
            QStringList list = str.split(',');
            QString location = index==0?"手机":"Sim卡";
            list.push_back(location);
            for(int col=0;col<7;col++)
            {
                //qDebug()<<list[col];
                row = tableWidget->rowCount();
                tableWidget->insertRow(row);

                tableWidget->setItem(count ,col,new QTableWidgetItem(list[col]));

            }
            count++;
        }
            std::stringstream ss;
            ss<<count;
            ui->tableWidget_PerCount->clearContents();
            //ui->tableWidget_PerCount->setItem(0,0,new QTableWidgetItem(QString(QString::fromStdString(ss.str()))));
            file.close();
    }
}


/*
 * @author  : Zeeland
 * @describe: 刷新两个页面
 * @param   : null
 * @return  : void
 */
void MainWindow::flushPage(int i,int j)
{
    flushPage(i);
    flushPage(j);
}


/*
 * @author  : Zeeland
 * @describe: 清除页面
 * @param   : null
 * @return  : void
 */
void MainWindow::clearPage(int index)
{
    index==0?ui->tableWidget_phone->clearContents():ui->tableWidget_sim->clearContents();
}

void MainWindow::clearPage(int i,int j)
{
    ui->tableWidget_sim->clearContents();
    ui->tableWidget_phone->clearContents();
}


/*
 * @author  : Zeeland
 * @describe: 跳转到SimPage页面
 * @param   : null
 * @return  : void
 */
void MainWindow::changeSimPage()
{
    ui->stackedWidget->setCurrentIndex(1);
    ui->tableWidget_PerCount->clearContents();
    ui->tableWidget_PerCount->setItem(0,0,new QTableWidgetItem(QString("a")));
}

/*
 * @author  : Zeeland
 * @describe: 跳转到PhonePage页面
 * @param   : null
 * @return  : void
 */
void MainWindow::changePhonePage()
{
    ui->stackedWidget->setCurrentIndex(0);
    ui->tableWidget_PerCount->clearContents();
    ui->tableWidget_PerCount->setItem(0,0,new QTableWidgetItem(QString("b")));
}

/*
 * @author  : Zeeland
 * @describe: 添加手机联系人，该函数在创建的时候会实例话一个addWidget窗口，实例化之后该窗口
 *            可以通过personController来控制新建联系人的操作
 * @param   : null
 * @return  : void
 */
void MainWindow::addPerson()
{
    addWidget =new AddWidget(ui->stackedWidget->currentIndex());
    //窗口销毁标志位函数绑定
    connect(addWidget,SIGNAL(hasDestory()),this,SLOT(hasDestory()),Qt::QueuedConnection);//指定特定对象的特定事件触发

    addWidget->show();
    //刷新页面
    flushPage(0,1);
}


/*
 * @author  : Zeeland
 * @describe: 该函数用于删除联系人， 在删除之前，需要先启动删除联系人的触发机制
 *            删除联系人,如果没有选中某一项，请先选中某一项再进行操作
 *            删除联系人的时候首先先检测在两个空间中有没有相同的人，如果存在相同的人名，则在两个空间都对其进行删除操作
 * @param   : null
 * @return  : void
 */
void MainWindow::deletePerson()
{
    qDebug()<<"-------------now  mainwindow deletePerson method start--------------";

    //获取到该页面的信息
    int index = ui->stackedWidget->currentIndex();
    QList<QString> PersonInfo;//将选中的人的信息放入一个集合中
    //在当前空间(sim or phone)选择该联系人
    QList<QTableWidgetItem*> items = index==1? ui->tableWidget_sim->selectedItems():ui->tableWidget_phone->selectedItems();
    //如果items为空则代表没有选中
    if(items.isEmpty())
    {
        QMessageBox::critical(this, "critical", "先选择一个联系人！", QMessageBox::Yes | QMessageBox::Yes);
    }
    else
    {

        int judge = QMessageBox::information(this, "Information", "确认删除?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);//判断对话框
        if(judge==QMessageBox::Yes)
        {
            QTableWidgetItem *item = items.at(0);
            PersonInfo.append(item->text());//将获取的信息添加到集合中
            //使用人口控制器去删除对应的用户
            bool hasSuccess =PersonController::deletePerson(PersonInfo[0]);
            flushPage(1,0);
            QMessageBox msgBox;
            msgBox.setText(hasSuccess?"删除成功":"删除失败，产生技术错误！");
            msgBox.setWindowTitle("Information");
            msgBox.exec();

            qDebug()<<"-------------now  mainwindow deletePerson method end--------------";
        }

    }
}


/*
 * @author  : Zeeland
 * @describe: 手机联系人转移到电话卡
 * @param   : null
 * @return  : void
 */
void MainWindow::pToS(){}

/*
 * @author  : Zeeland
 * @describe: 电话卡联系人转移到手机
 * @param   : null
 * @return  : void
 */
void MainWindow::sToP(){}

/*
 * @author  : Zeeland
 * @describe: 修改联系人信息,首先需要选中一个联系人，然后点击修改联系人
 *            之后进入修改联系人页面进行操作
 * @param   : null
 * @return  : void
 */
void MainWindow::modifyPerson()
{
    //获取到该页面的信息
    int index =ui->stackedWidget->currentIndex()==0?0:1;

    QList<QString> personInfo;//将选中的人的信息放入一个集合中
    //在当前空间(sim or phone)选择该联系人
    QList<QTableWidgetItem*> items = index==1? ui->tableWidget_sim->selectedItems():ui->tableWidget_phone->selectedItems();
    //如果items为空则代表没有选中
    if(items.isEmpty())
    {
        QMessageBox::critical(this, "critical", "先选择一个联系人！", QMessageBox::Yes | QMessageBox::Yes);
    }
    else
    {
        //选中了之后定位QTableWidget中的该行内容
        int count = items.count();
        for(int i = 0; i < count; i++)
        {
            QTableWidgetItem *item = items.at(i);
            personInfo.append(item->text());//将获取的信息添加到集合中
        }
        //PersonController::printQList(personInfo);
        EditWidget *w =new EditWidget(index,personInfo);//跳转到EditWidget页面
        w->show();
    }
}


/*
 * @author  : Zeeland
 * @describe: 搜索联系人,调用PersonController类中的静态方法search来返回所有符合信息的人
 *            搜索到联系人之后，清空tableWidget，将所有符合条件的人显示在上面
 * @param   : null
 * @return  : void
 */
void MainWindow::searchPerson()
{
    QString name = ui->lineEdit_searchMan->text();
    ui->tableWidget_sim->scrollToTop();
    ui->tableWidget_phone->scrollToTop();
    if(name!="")
    {
        QList<QList<QString>> list =PersonController::search(name);
        bool hasPerson = list.size();
        if (hasPerson)
        {
            clearPage(0,1);
            int row;
            QString displayString;
            for(int i=0;i<list.size();i++)
            {
                for(int col=0;col<7;col++)
                {
                    row = ui->tableWidget_sim->rowCount();
                    ui->tableWidget_sim->insertRow(row);
                    ui->tableWidget_sim->setItem( i,col,new QTableWidgetItem(list[i][col]));
                    ui->tableWidget_phone->insertRow(row);
                    ui->tableWidget_phone->setItem(i ,col,new QTableWidgetItem(list[i][col]));
                }
            }
        }
        else
        {
            clearPage(0,1);
        }
    }
    else
    {
        flushPage(1,0);
    }

}

//键盘按下触发事件
void MainWindow::keyPressEvent(QKeyEvent *ev)
{
    if(ev->key() == Qt::Key_Delete)
    {
        deletePerson();
        return;
    }
    QWidget::keyPressEvent(ev);
}


MainWindow::~MainWindow()
{
    delete ui;
}
